package eu.hellek.gba.server.rpc.servlets; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.google.protobuf.CodedInputStream; import eu.hellek.gba.model.Point; import eu.hellek.gba.proto.Helpers; import eu.hellek.gba.proto.RequestsProtos.IndirectSearchRequest; import eu.hellek.gba.proto.SearchResultProtos.SearchResultProxy; import eu.hellek.gba.proto.SearchResultProtos.SearchResultProxy.Builder; import eu.hellek.gba.server.dao.Dao; import eu.hellek.gba.server.rpc.ExtractedFunctions; import eu.hellek.gba.server.rpc.ListPointsServiceImpl; import eu.hellek.gba.server.utils.Utils; public class IndirectSearchServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final String location = "IndirectSearchServlet"; @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { service(req, resp); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { service(req, resp); } @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { InputStream is = req.getInputStream(); try { IndirectSearchRequest r = IndirectSearchRequest.parseFrom(CodedInputStream.newInstance(is)); // System.err.println("called: " + r); float lat1 = r.getLat1(); float lon1 = r.getLon1(); float lat2 = r.getLat2(); float lon2 = r.getLon2(); List<String> mlkSet1String = r.getMlkSet1StringList(); List<String> mlkSet2String = r.getMlkSet2StringList(); double distanceBetweenPoints = Utils.distanceInMeters(new Point("", lat1, lon1, null), new Point("", lat2, lon2, null)); SearchResultProxy toSend; if(distanceBetweenPoints > 1000) { int requests = 0; if(req.getSession() != null && req.getSession().getId() != null) { requests = Dao.getInstance().addAndCheckSearchForIp(req.getSession().getId(), 1); } else { requests = Dao.getInstance().addAndCheckSearchForIp(req.getRemoteAddr(), 1); } if(requests < ListPointsServiceImpl.maxRequestsIndirect) { eu.hellek.gba.shared.SearchResultProxy res = new ExtractedFunctions().getIndirectConnections(lat1, lon1, lat2, lon2, r.getIgnoreTrains(), r.getIgnoreSubte(), mlkSet1String, mlkSet2String); toSend = Helpers.copyToProto(res); } else { Logger.getLogger(location).log(Level.WARNING, location + ": too many requests for ip " + req.getRemoteAddr() + ": " + requests); Builder builder = SearchResultProxy.newBuilder(); builder.setError(eu.hellek.gba.shared.SearchResultProxy.tooManyReqests); toSend = builder.build(); } } else { Logger.getLogger(location).log(Level.INFO, location + ": distance too little " + distanceBetweenPoints); Builder builder = SearchResultProxy.newBuilder(); builder.setError(eu.hellek.gba.shared.SearchResultProxy.distanceTooLittle); toSend = builder.build(); } toSend.writeTo(resp.getOutputStream()); } catch (Exception e) { Logger.getLogger("IndirectSearchServlet").log(Level.SEVERE, "Error: " + e); e.printStackTrace(); } } }